Introducción al desarrollo de aplicaciones web
Utilizando el framework Django

Presenter Notes

Modelos

Presenter Notes

Modelos

Los modelos encapsulan la información referente al dominio de la aplicación web. Compuestos por campos generalmente cada modelo mapea a una única tabla de la base de datos.

  • Cada modelo es una clase en Python que hereda de django.db.models.Model.

  • Cada atributo del modelo se corresponde con una columna en la base de datos.

  • Con esto Django genera automáticamente una API de acceso a datos.

Bases de datos

Django tiene 4 backends oficiales MySQL, SQLite, Postgres y Oracle.

Existen otros backends creados por la comunidad para Firebird, ODBC, SQL Server y bases de datos no relacionales.

Presenter Notes

Modelos - Campos

Básicos

  • BooleanField
  • CharField
  • TextField
  • IntegerField
  • FloatField
  • DateTimeField

Relaciones

  • ForeignKey
  • ManyToManyField
  • OneToOneField

Plus

  • EmailField
  • DateField
  • TimeField
  • SlugField
  • FileField
  • ImageField
  • CommaSeparatedIntegerField
  • IPAddressField
  • UrlField

Presenter Notes

Modelos - Ejemplo

 1 class Persona(models.Model):
 2     nombre = models.CharField(max_length=50)
 3 
 4 
 5 class Mascota(models.Model):
 6     # Constantes
 7     MACHO, HEMBRA = 'm', 'h'
 8     SEXO_CHOICES = (
 9         (MACHO, 'Macho'), (HEMBRA, 'Hembra')
10     )
11     duenio = models.ForeignKey(Persona, null=True, blank=True)
12     raza = models.ForeignKey('Especie') # Relación hacia adelante
13     sexo = models.CharField(max_length=1, choices=SEXO_CHOICES)
14 
15 class Especie(models.Model):
16     nombre = models.CharField(max_length=50)
17     domesticable = models.BooleanField(default=True)
18 
19 class Raza(models.Model):
20     nombre = models.CharField(max_length=50)
21     especie = models.ForeignKey(Especie)

Presenter Notes

Ejemplos - Contiunación

Validación

1 python manage.py validate
2 
3 0 errors found

Creación de tablas

1 python manage.py syncdb
2 
3 Creating table common_persona
4 Creating table common_mascota
5 Creating table common_especie
6 Creating table common_raza

Presenter Notes

Equivalencia en SQL

Presenter Notes

Equivalencia SQL

 1 BEGIN;
 2 CREATE TABLE "common_persona" (
 3     "id" integer NOT NULL PRIMARY KEY,
 4     "nombre" varchar(50) NOT NULL
 5 );
 6 CREATE TABLE "common_mascota" (
 7     "id" integer NOT NULL PRIMARY KEY,
 8     "duenio_id" integer REFERENCES "common_persona" ("id"),
 9     "raza_id" integer NOT NULL,
10     "sexo" varchar(1) NOT NULL
11 );
12 CREATE TABLE "common_especie" (
13     "id" integer NOT NULL PRIMARY KEY,
14     "nombre" varchar(50) NOT NULL,
15     "domesticable" bool NOT NULL
16 );
17 CREATE TABLE "common_raza" (
18     "id" integer NOT NULL PRIMARY KEY,
19     "nombre" varchar(50) NOT NULL
20 );
21 COMMIT;

Y esto sin contar los índices!

Presenter Notes

Modelos - Uso

Los modelos herdean el comportamiento de models.Model, métodos como save y delete ya están disponibles para ser utilizados.

 1 from miapp.models import Persona
 2 
 3 p = Persona(nombre='Dundee')
 4 p.save()
 5 
 6 p.id
 7 # -> 1
 8 
 9 p.save()
10 p.id
11 # -> 1
12 
13 q = Persona()
14 q.nombre = 'Anonio'
15 # -> None
16 q.save()
17 
18 q.nombre = 'Antonieta'
19 q.save()
20 q.delete()

Presenter Notes

Otras opciones para los modelos

  1. Al ser clases los modelos pueden tener métodos que efectuen alguna acción en función de los datos que contengan, por ejemplo, la representación como cadena:

    1 class Persona(models.Model):
    2     nombre = models.CharField(max_length=50)
    3     def __unicode__(self):
    4         return "Soy %s" % self.nombre
    
  2. Metainformación Permite agregar información como el nombre de la tabla en la base de datos, una etiqueta de texto, orden por defecto, restricciones de unicidad, etc.

    1 class Registro(models.Model):
    2     fecha = models.DateField()
    3     class Meta:
    4         verbose_name = "Registro de actividad"
    5         verbose_name_plural = "Registros de actividad"
    6         ordering = '-fecha'
    

Presenter Notes

Managers

Django provee una propiedad en todos los modelos que nos permite hacer SELECT, INSERT, UPDATE y DELETE muy facilmente.

1 Persona.objects.create(nombre='Jose')
2 
3 Persona.objects.filter(nombre__istartswith='jos')
4 
5 mascotas = Mascota.objects.exclude(sexo=Mascota.MACHO)
6 
7 mascotas.filter(raza=Raza).delete()

Presenter Notes

Managers (cont)

Evaluación perezoa

Los managers devuelven objetos del tipo QuerySet con el SQL calculado pero no evaluado (no se ejecutó sobre la base), cuando se recorre por primera vez, se ejecuta la consulta.

Presenter Notes

Aplicaciones de 3ros

Presenter Notes

Por que utilizar aplicaciones de 3ros

Si bien django provee un buen número de características como

Disponemos de muchos paquetes de 3ros que se instalan con pip y proveen extensiones, comandos, template tags, vistas genericas, etc.

Presenter Notes

Las aplicaciones de terceros ahorran mucho tiempo.

Presenter Notes

South

Presenter Notes

Que es?

South es una herramienta de migración de datos, permite gestionar el cambio en nuestros modelos desde un nivel de abstracción alto, minimizando de esta manera el uso de SQL.

Agrega commandos en manage.py para trabajar dichos cambios:

  1. Analiza las diferencias entre models.py y la base de datos y genera un script de migración

  2. Aplica o desaplica migraciones de esquema (estructura)

  3. Convierte aplicaciones que no usen South, en aplicaciones con South

  4. Aplica o desaplica migraciones de datos

2 y 4 son transparentes

Presenter Notes

Instalación y Uso

Se instala con pip en nuestro ambiente

1 pip install South

Se agrega como una aplicación instalada en setting.py en la lista de INSTALLED_APPS.

1 INSTALLED_APPS = ( 'south', )

Comandos basicos

 1 # Convertir a South
 2 python manage.py convert_to_south common
 3 # Crear una migración
 4 python manage.py schemamigration common --auto
 5 # Aplicar una migración
 6 python manage.py migrate common
 7 # Listar
 8 python manage.py migrate common --list
 9 # Vovler a algún estado de la base de atos
10 python manage.py migrate common 001

Presenter Notes

Django Debug Toolbar

Presenter Notes

Que es?

Es una coleccion de paneles configurables que presenta mucha informacion de debug referida al request/response en curso.

Que podemos ver dentro de toda esa informacion:

  1. La vesion de Django
  2. El tiempo de Request
  3. Las configuraciones en settings.py
  4. Los encabezados HTTP
  5. Las variables de GET/POST/cookie/session
  6. Las plantillas y los contextos usados para generar el HTML
  7. Las consultas en SQL, sus tiempos y la explicacion de cada una
  8. Las señales emitidas
  9. Los logs emitidos por el modulo de logging configurado en Django

Presenter Notes

Instalación

Instalacion con pip

1 pip install django-debug-toolbar

Modificamos settings.py para agregar la aplicacion, el middleware y algo de seguridad.

 1 INSTALLED_APPS = (
 2     ...
 3     'debug_toolbar',
 4 )
 5 
 6 # El orden es imporatante, debe estar despues de los middlewares que apliquen algun encoding sobre el response
 7 MIDDLEWARE_CLASSES = (
 8     # ...
 9     'debug_toolbar.middleware.DebugToolbarMiddleware',
10     # ...
11 )
12 
13 # Solo para localhost
14 INTERNAL_IPS = ('127.0.0.1',)

Presenter Notes

Configuracion

En settings.py

 1 DEBUG_TOOLBAR_PANELS = (
 2     'debug_toolbar.panels.version.VersionDebugPanel',
 3     'debug_toolbar.panels.timer.TimerDebugPanel',
 4     'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
 5     'debug_toolbar.panels.headers.HeaderDebugPanel',
 6     'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
 7     'debug_toolbar.panels.template.TemplateDebugPanel',
 8     'debug_toolbar.panels.sql.SQLDebugPanel',
 9     'debug_toolbar.panels.signals.SignalDebugPanel',
10     'debug_toolbar.panels.logger.LoggingPanel',
11 )
12 
13 DEBUG_TOOLBAR_CONFIG = {
14     'INTERCEPT_REDIRECTS': False,
15     'SHOW_TOOLBAR_CALLBACK': lambda request: True,
16     'EXTRA_SIGNALS': ['myproject.signals.MySignal'],
17     'HIDE_DJANGO_SQL': False,
18     'SHOW_TEMPLATE_CONTEXT': True,
19     'TAG': 'div',
20     'ENABLE_STACKTRACES' : True,
21 }

Presenter Notes